/**
 * 支付工具类
 * 封装支付调用细节，提供统一的支付接口和回调机制
 */
class PaymentUtil {
  /**
   * 发起支付（使用已获取的支付信息）
   * @param {Object} payInfo 支付信息（从PaymentApi.createPayment获取）
   * @param {Object} callbacks 回调函数
   * @param {Function} callbacks.onSuccess 支付成功回调
   * @param {Function} callbacks.onFail 支付失败回调
   * @param {Function} callbacks.onCancel 支付取消回调（可选）
   * @returns {Promise<boolean>} 返回支付是否发起成功
   */
  static async initiatePayment(payInfo, callbacks = {}) {
    const {
      onSuccess = () => {},
      onFail = () => {},
      onCancel = () => {}
    } = callbacks;

    try {
      // 获取支付提供商（provider既是环境又是支付类型）
      const channel = Number(uni.getStorageSync('channel'));
      
      console.log(channel === 1)
      if (channel === 1) {
        // 微信支付
        return await this._wechatPay(payInfo, { onSuccess, onFail, onCancel });
      } else if (channel === 0) {
        // 支付宝支付
        return await this._alipayPay(payInfo, { onSuccess, onFail, onCancel });
      } else {
        throw new Error('未知的支付提供商');
      }
    } catch (error) {
       uni.showToast({
          title: '支付失败',
          icon: 'none'
        });
      console.error('支付发起失败:', error);
      onCancel(error);
      return false;
    } finally {
     }
  }

  /**
   * 微信支付处理
   * @private
   */
  static async _wechatPay(payInfo, callbacks) {
    const { onSuccess, onFail, onCancel } = callbacks;
    
 

    try {
      console.log('支付参数:', payInfo);
      uni.hideLoading();

      // 调用微信支付
      return new Promise((resolve) => {
        uni.requestPayment({
          provider: 'wxpay',
          timeStamp: payInfo.timeStamp,
          nonceStr: payInfo.nonceStr,
          package: payInfo.package,
          signType: payInfo.signType,
          paySign: payInfo.paySign,
          success: (payRes) => {
            console.log('支付成功:', payRes);
            uni.showToast({
              title: '支付成功',
              icon: 'success'
            });
            onSuccess(payRes);
            resolve(true);
          },
          fail: (payErr) => {
            console.log('支付失败:', payErr);
            if (payErr.errMsg && payErr.errMsg.includes('cancel')) {
              // 用户取消支付
              uni.showToast({
                title: '支付已取消',
                icon: 'none'
              });
              onCancel(payErr);
            } else {
              // 支付失败
              uni.showToast({
                title: '支付失败',
                icon: 'none'
              });
              onCancel(payErr);
            }
            resolve(false);
          }
        });
      });
    } catch (error) {
      uni.hideLoading();
      const errorMsg = error.message || '支付调用失败';
      uni.showToast({
        title: errorMsg,
        icon: 'none'
      });
      console.log('支付调用失败:', error);
      onCancel(error);
      return false;
    }
  }

  /**
   * 支付宝支付处理
   * @private
   */
  static async _alipayPay(payInfo, callbacks) {
    const { onSuccess, onFail, onCancel } = callbacks;
    
    uni.showLoading({
      title: '正在跳转支付...'
    });

    try {
      console.log('支付宝支付参数:', payInfo);
      
      // 模拟支付宝支付处理
      setTimeout(() => {
        uni.hideLoading();
        uni.showToast({
          title: '跳转支付宝支付',
          icon: 'success'
        });
        
        // 模拟支付成功（实际应用中这里应该调用支付宝支付API）
        setTimeout(() => {
          onSuccess({ provider: 'alipay', payInfo });
        }, 1000);
      }, 1000);
      
      return true;
    } catch (error) {
      uni.hideLoading();
      const errorMsg = error.message || '支付调用失败';
      uni.showToast({
        title: errorMsg,
        icon: 'none'
      });
      console.log('支付宝支付调用失败:', error);
      onCancel(error);
      return false;
    }
  }

  /**
   * 获取支付类型文本
   * @returns {string} 支付类型文本
   */
  static getPaymentTypeText() {
    const channel = uni.getStorageSync('channel');
    if (channel === 1) {
      return '微信支付';
    } else if (channel === 0) {
      return '支付宝支付';
    }
    return '未知支付方式';
  }

  /**
   * 获取支付类型
   * @returns {string} 支付类型 (wechat/alipay)
   */
  static getPaymentType() {
    const channel = uni.getStorageSync('channel');
    if (channel === 1) {
      return 'wechat';
    } else if (channel === 0) {
      return 'alipay';
    }
    return 'unknown';
  }
}

export default PaymentUtil;